package com.runtime.hongyunmanage.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.runtime.hongyunmanage.bean.Categories;
import com.runtime.hongyunmanage.mapper.CategoryMapper;
import com.runtime.hongyunmanage.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Objects;

@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Categories> implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public boolean addCategory(Categories category) {
        // 处理空值：父级ID默认为0（一级分类），排序号默认为0
        category.setParentId(category.getParentId() == null ? 0L : category.getParentId());
        category.setSortOrder(category.getSortOrder() == null ? 0L : category.getSortOrder());
        // 校验：同一父级下分类名称唯一
        if (baseMapper.countSameNameCategory(category.getParentId(), category.getCategoryName()) > 0) {
            categoryMapper.save(category);
            return false;
        }
        // 校验：父级ID存在（非0时必须存在）
        if (category.getParentId() != 0 && getCategoryById(category.getParentId()) == null) {
            categoryMapper.save(category);
            return false;
        }
        categoryMapper.save(category);
        return true;
    }

    @Override
    public Categories getCategoryById(Long categoryId) {
        return baseMapper.selectById(categoryId);
    }

    @Override
    public List<Categories> getCategoryList(Long parentId, String keyword) {
        if (parentId != null) {
            return baseMapper.getCategoryListByParentId(parentId);
        } else if (keyword != null && !keyword.isEmpty()) {
            return baseMapper.getCategoryListByKeyword(keyword);
        }
        // 无参数时查询根分类（一级分类）及其子树
        return baseMapper.getCategoryTreeAll();
    }

    @Override
    public boolean updateCategory(Categories category) {
        Categories oldCategory = getCategoryById(category.getCategoryId());
        if (oldCategory == null) return false;

        // 校验名称唯一性（若名称修改）
        if (!oldCategory.getCategoryName().equals(category.getCategoryName())) {
            if (baseMapper.countSameNameCategory(category.getParentId(), category.getCategoryName()) > 0) {
                return false;
            }
        }

        // 安全比较父级 ID（处理 null 情况）
        Long oldParentId = oldCategory.getParentId();
        Long newParentId = category.getParentId();

        if (!Objects.equals(oldParentId, newParentId)) { // 替换原比较逻辑
            // 新父级 ID 为 null 时，无需校验存在性（允许为 null）
            if (newParentId != null) { // 仅当新父级 ID 不为 null 时校验
                // 校验父级分类是否存在（排除 0L，假设 0L 代表根节点）
                if (!newParentId.equals(0L) && getCategoryById(newParentId) == null) {
                    return false;
                }
                // 校验循环引用（子分类不能成为自己的父级）
                if (isCyclicReference(category.getCategoryId(), newParentId)) {
                    return false;
                }
            }
        }

        return updateById(category);
    }

    private boolean isCyclicReference(Long currentId, Long parentId) {
        if (parentId == 0) return false; // 根分类无父级，终止递归
        if (parentId.equals(currentId)) return true; // 父级是自己，循环引用
        Categories parentCategory = getCategoryById(parentId);
        return parentCategory != null && isCyclicReference(currentId, parentCategory.getParentId());
    }

    @Override
    public boolean deleteCategory(Long categoryId) {
        // 前置校验：存在子分类则禁止删除
        if (baseMapper.countChildCategories(categoryId) > 0) {
            return false;
        }
        // 前置校验：存在关联商品则禁止删除
        if (baseMapper.countRelatedProducts(categoryId) > 0) {
            return false;
        }
        return removeById(categoryId);
    }

    @Override
    public boolean deleteCategoryimage(Categories category) {
        // 参数校验
        if (category == null || category.getCategoryId() == null) {
            throw new IllegalArgumentException("分类ID不能为空");
        }

        try {
            // 更新数据库中的 imageUrl 字段
            int rows = categoryMapper.deleteCategoryimage(category.getCategoryId(),category.getImageUrl());
            return rows > 0;
        } catch (Exception e) {
            // 记录异常日志
            throw new RuntimeException("更新分类图片URL失败", e);
        }
    }

}